#pragma once 
#include<iostream>
#include<assert.h>

using namespace std;

class Date
{
    //out是电脑终端，实质是流插入是向终端写入数据,将返回值设为ostream& 是为解决连续流插入问题
    friend ostream& operator<<(ostream& out,const Date& date);//友元函数声明，可以使该函数能够访问该类里面的私有数据
    friend istream& operator>>(istream& in,Date& date);
public:
    Date(int year=1973,int month=7,int day=5);

    //编译器生成的默认拷贝构造函数，会对内置类型的成员变量浅拷贝，对自定义类型的成员变量调用它的拷贝构造
    Date(const Date& date);//所以这里的拷贝构造函数可以不用写

    //编译器生成的默认赋值重载，会对内置类型的成员变量浅拷贝，对自定义类型的成员变量调用它的赋值重载函数
    Date& operator=(const Date& date);//所以这里的赋值重载函数可以不写

    //得到 year.month 的天数
    int GetMonthDay(int year,int month);

    void Print();

    bool operator==(const Date& date);
    bool operator>(const Date& date);
    bool operator>=(const Date& date);
    bool operator<(const Date& date);
    bool operator<=(const Date& date);

    Date& operator+=(int day);
    Date operator+(int day);

    Date& operator++();//前置++
    Date operator++(int);//后置++
    Date& operator--();//前置--
    Date operator--(int);//后置--

    Date& operator-=(int day);
    Date operator-(int day);

    //Date operator-(Date date);//日期-日期
    int operator-(Date date);//日期-日期

    //流插入函数重载不可定义为成员函数，否则只能这样使用：t1<<cout; 
    //因为实例化出来的对象调用成员函数时必须得在操作符左边
    //如何解决？？ ---定义成全局的即可
    //void operator<<(ostream& out);//流提取运算符重载

private:
    int _year;
    int _month;
    int _day;
};
ostream& operator<<(ostream& out,const Date& date);
istream& operator>>(istream& in,Date& date);